// 文件处理工具函数

/**
 * 验证文件是否为CSV格式
 * @param file 上传的文件对象
 * @returns 是否为CSV文件
 */
export const isValidCSV = (file: File): boolean => {
  const fileType = file.type;
  const fileName = file.name.toLowerCase();
  return fileType === 'text/csv' || fileName.endsWith('.csv');
};

/**
 * 解析CSV文件内容
 * @param content CSV文件内容
 * @returns 解析后的数据和列信息
 */
export const parseCSV = (content: string) => {
  const lines = content.split('\n').filter(line => line.trim());
  if (lines.length === 0) {
    throw new Error('CSV文件内容为空');
  }

  // 获取列名
  const headers = lines[0].split(',').map(header => header.trim());
  
  // 解析数据行
  const data: Record<string, string>[] = [];
  for (let i = 1; i < lines.length; i++) {
    const values = lines[i].split(',');
    const row: Record<string, any> = {};
    headers.forEach((header, index) => {
      row[header] = values[index] ? values[index].trim() : '';
    });
    data.push(row);
  }

  // 推断列类型
  const columns = headers.map(header => {
    let type: 'string' | 'number' | 'boolean' | 'date' = 'string';
    
    // 尝试推断类型
    const nonEmptyValues = data.map(row => row[header]).filter(val => val !== '');
    if (nonEmptyValues.length > 0) {
      // 检查是否全为数字
      const allNumbers = nonEmptyValues.every(val => !isNaN(Number(val)));
      if (allNumbers) {
        type = 'number';
      }
      // 检查是否全为布尔值
      else if (nonEmptyValues.every(val => ['true', 'false', '1', '0'].includes(val.toLowerCase()))) {
        type = 'boolean';
      }
      // 检查是否为日期
      else if (nonEmptyValues.every(val => !isNaN(Date.parse(val)))) {
        type = 'date';
      }
    }
    
    return {
      name: header,
      type,
      isSelected: true,
      isTarget: false
    };
  });

  return {
    headers,
    data,
    columns,
    rows: data.length
  };
};

/**
 * 生成唯一ID
 * @returns 唯一ID字符串
 */
export const generateId = (): string => {
  return Date.now().toString(36) + Math.random().toString(36).substr(2);
};

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @returns 格式化后的大小字符串
 */
export const formatFileSize = (bytes: number): string => {
  if (bytes === 0) return '0 Bytes';
  const k = 1024;
  const sizes = ['Bytes', 'KB', 'MB', 'GB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
};

/**
 * 格式化日期时间
 * @param dateString 日期时间字符串或Date对象
 * @returns 格式化后的日期时间字符串
 */
export const formatDateTime = (dateString: string | Date): string => {
  const date = typeof dateString === 'string' ? new Date(dateString) : dateString;
  return date.toLocaleString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit'
  });
};